#include "main.h"




/*单链表初始化。初始化成功函数返回0，否则返回1。*/
int ListInitiate(SLNode **head)
{
    SLNode *p;
    p=(SLNode*) malloc(sizeof(SLNode));
    if(p==NULL)
        return 1;
    else
    {
        p->data = 0;
        p->next = NULL;
        *head = p;
    }
    return 0;
}

/* 函数返回由head所表示的单链表的长度。  */
int ListLength(SLNode *head)
{
    int i=0;
    SLNode *p;
    p = head->next;
    while(p)
    {
        i++;
        p = p->next;
    }
    return i;
}

// 在由head所表示的单链表里插入一个元素 x 到位置 i。
// 插入成功函数返回0，否则返回1。

int ListInsert(SLNode *head, int i, DataType x)
{
    SLNode *p,*r;
    int j=0;
    p=head;

    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    if(j!=i)
    {
        printf("插入的元素不合理\n");
        return 1;
    }
    r=(SLNode*)malloc(sizeof(SLNode));
    if(r==NULL)
    {
        printf("插入的位置不合理\n");
        return 1;
    }

    r->data=x;
    r->next=p->next;
    p->next=r;
    return 0;
}

// 在由head所表示的单链表里删除位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度减1。
int ListDelete(SLNode *head, int i, DataType *x)
{
    SLNode *p,*r;
    int j=0;
    p=head;
    while(p->next&&j<i)
    {
        p=p->next;
        j++;
    }
    if(p->next==NULL)
    {
        printf("删除位置不合法");
        return 0;
    }
    r=p->next;
    p->next=r->next;
    *x=r->data;
    free(r);
    return 1;
}
// 在由head所表示的单链表里获取位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度不变。
int ListGet(SLNode *head, int i, DataType *x)
{
    SLNode *p;
    p=head;
    int j;
    for(j=0;j < i;j++) {
        p = p->next;
    }
    if (!p || j > i) {
        printf("该元素不存在！");
        return 0;
    }


    p = p->next;
    *x=p->data;
    return *x;

}

int Destroy(SLNode **head)
{
    SLNode *p,*r;
    p=*head;
    while(p!=NULL)
    {
        r=p;
        p=p->next;
        free(r);
    }
    *head=NULL;
    return 0;
}


int main()
{
    SLNode *head;
    int i , x;
    ListInitiate(&head);/*初始化*/
    for(i = 0; i < 10; i++)
    {

        if(ListInsert(head, i, i+1) != 0) /*插入10个数据元素*/
        {
            printf("错误! \n");
        }
    }
    if(ListDelete(head, 4, &x) == 0) /*删除数据元素5*/
    {
        printf("错误! \n");
    }
    printf("%d\n",ListLength(head));
    for(i = 0; i < ListLength(head); i++)
    {
        if(ListGet(head, i, &x) == 0) /*取元素*/
        {
            printf("错误! \n");
        }
        else printf("%d     ", x);/*显示数据元素*/
    }

    Destroy(&head);
}